Make clearing and restoring the may_leave flag more amenable to opt…#13713
Merged
cfallin merged 1 commit intoJun 23, 2026
Merged
Conversation
…imization
The clear-and-restore is now structured so that if translation doesn't actually
call any functions (e.g. due to inlining) then a future dead-store elimination
pass in Cranelift can remove all the flag juggling entirely (other than trapping
when `!may_leave`):
may_leave = load vmctx+MAY_LEAVE_OFFSET ;; (0)
trapz may_leave
...
zero = iconst 0
store zero, vmctx+MAY_LEAVE_OFFSET ;; (1)
...
store may_leave, vmctx+MAY_LEAVE_OFFSET ;; (2)
First, the dead-store elimination pass will see that the the store at
(1): is dead and remove it. Then, the idempotent-store eliminator will recognize
that the store at (2) is storing the same value that the memory location already
contains and it will also be removed. The more we can reuse locals to make this
idempotency obvious, rather than force Cranelift's optimizer to rediscover this
information, the better.
cfallin
approved these changes
Jun 23, 2026
cfallin
left a comment
Member
There was a problem hiding this comment.
Great idea -- the separate may-leave flag global is of course a cost but it seems like that should be tiny compared to the advantages we get being able to reason about it separately. LGTM!
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
…imization
The clear-and-restore is now structured so that if translation doesn't actually call any functions (e.g. due to inlining) then a future dead-store elimination pass in Cranelift can remove all the flag juggling entirely (other than trapping when
!may_leave):First, the dead-store elimination pass will see that the the store at (1): is dead and remove it. Then, the idempotent-store eliminator will recognize that the store at (2) is storing the same value that the memory location already contains and it will also be removed. The more we can reuse locals to make this idempotency obvious, rather than force Cranelift's optimizer to rediscover this information, the better.